package com.hgsoft.pubsv.component.base.redis;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * redis lock方法
 * @author saint-yeb
 */
@Component
public class RedisLockUtil extends RedisCommon{

	private Logger logger = LoggerFactory.getLogger(RedisLockUtil.class);
	
	private static final String LOCKKEYPREFIX="lock:";

    /** 锁的默认超时时间: 10秒*/
    public static final Long LOCK_TIMOUT = 10000L;

	/**
    * 加锁
    * @param key
    * @param value 当前时间+超时时间
    * @return
    */
   public boolean lock(String key, String value) {
	   key = LOCKKEYPREFIX+key;
       if (stringRedisTemplate.opsForValue().setIfAbsent(key.trim(), value)) {
           return true;
       }
       //current Value=A 这两个线程的value都是B 其中一个线程拿到锁
       String currentValue = (String) stringRedisTemplate.opsForValue().get(key.trim());
       //如果锁未过期
       if (!StringUtils.isEmpty(currentValue) && Long.parseLong(currentValue) < System.currentTimeMillis()) {
           //获取上一个锁的时间
           String oldValue = (String) stringRedisTemplate.opsForValue().getAndSet(key.trim(), value);
           if (!StringUtils.isEmpty(oldValue) && oldValue.equals(currentValue)) {
               return true;
           }
       }
       return false;
   }

   /**
    * 解锁
    * @param key
    * @param value
    * @return
    */
   public void unlock(String key, String value) {
	   key = LOCKKEYPREFIX+key;
       String currentVaule = (String) stringRedisTemplate.opsForValue().get(key.trim());
       try {
           if (!StringUtils.isEmpty(currentVaule) && currentVaule.equals(value)) {
        	   stringRedisTemplate.opsForValue().getOperations().delete(key.trim());
           }
       } catch (Exception e) {
    	   logger.error("【redis分布式锁】解锁异常，{}" , e);
       }

   }
}
